package com.jt.aop;

import com.fasterxml.jackson.databind.util.JSONPObject;
import com.jt.vo.SysResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;

/**
 * @auther Zangyiyi
 * @date 2020/7/8 - 16:23
 */
//标识类是全局异常处理机制的配置类
@RestControllerAdvice
@Slf4j
public class SystemExeceptionAOP {
    /*
     *添加统用异常返回的方法
     * 底层原理:AOP的异常通知
     *
     * 常规手段: SysResult.fail()
     * 跨域访问: JSONP 必须满足JSONP跨域访问要求  callback(SysResult.fail(0)
     *
     * 问题:如何断定用户使用的是跨域方式还是普通业务调用??
     * 分析:jsonp请求  get请求的方式携带??callback
     * 判断依据:用户参数是否携带callback 特定参数,一般条件下不会使用
     */
    @ExceptionHandler({RuntimeException.class})
    public Object SystemResultException(HttpServletRequest request,Exception exception) {//拦截运行时异常
        String callback = request.getParameter("callback");

        if (StringUtils.isEmpty(callback)){
            //exception.printStackTrace();//如果有问题,则在控制台打印
            log.error(exception.getMessage());
            return SysResult.fail();  //返回统一的失败数据
        }

        //说明:有可能跨域 jsonp只能提交GET请求
        String method = request.getMethod();
        if (!method.equalsIgnoreCase("GET")){
            //如果不是get请求,不是jsonp请求方式
            log.error(exception.getMessage());
            return SysResult.fail();  //返回统一的失败数据
        }
            log.error(exception.getMessage());
        //如果程序执行到这来,标识进行了JSONP的请求,安装JSONP的方式返回数据
        return new JSONPObject(callback, SysResult.fail());
    }
}









